[Log #2] LogBack을 이용한 로그 설정

[애플리케이션 코드] → Logger.info/debug/warn(...)


                       logback-spring.xml

                ┌─────────────┼─────────────┐
                ▼             ▼             ▼
          ConsoleAppender  RollingFileAppender  (SMTP/DB Appender 등)
           (콘솔 출력)      (파일 저장 + 롤링)      (선택적 확장)

LogBack

  • Spring Boot에서 로그를 다룰 때 가장 많이 쓰는 로깅 구현체는 Logback
  • logback-spring.xml을 이용하면 로그 포맷, 출력 방식, 파일 보관 정책 등을 유연하게 설정 가능.

로그 출력 경로 제어

Appender 클래스설명
ConsoleAppender콘솔에 출력
FileAppender고정된 파일에 저장
RollingFileAppender시간/용량 기준으로 파일 분리 저장
SMTPAppender메일 전송용
DBAppenderDB에 로그 저장용

로그 Level정의

Level설명
OFF로그 기록 안 함
FATAL시스템 치명적 오류
ERROR예상하지 못한 오류
WARN경고, 주의 필요
INFO운영 중 참고용 메시지
DEBUG개발 중 디버깅 정보
TRACE가장 세세한 단계의 로그

로그 롤링 정책 (파일 관리)

fileNamePattern: 저장될 파일명 패턴
maxHistory: 보관할 최대 파일 개수
maxFileSize: 파일 1개의 최대 용량
totalSizeCap: 전체 로그 용량 제한 (초과 시 오래된 로그 삭제됨)

로그 패턴 정책

패턴설명
%d{yyyy-MM-dd HH:mm:ss.SSS}로그 발생 시점의 날짜와 시간을 포맷에 맞춰 출력→ 2025-04-07 15:32:12.451
------
%magenta(…)해당 내용(여기선 쓰레드)을 보라색으로 출력 (콘솔 색상 적용용)
%thread로그를 출력한 스레드 이름
%highlight(…)로그 레벨에 따라 색상을 자동 적용(ex INFO → 녹색, WARN → 노란색, ERROR → 빨간색 등)
%level로그 레벨(INFO, WARN, ERROR 등)을 표시
%logger{5}로거 이름(클래스명 또는 패키지 경로)의 마지막 5개 단어만 표시(ex com.example.controller.UserController → c.e.c.UserController)
-구분자 (시각적 효과)
%msg실제 로그 메시지 내용
%n줄바꿈 (platform-specific newline, \n 또는 \r\n 등)

LogBack 설정 예시

[ 로그 저장 형식 지정 및 설정 ]
   
   <!-- 콘솔 출력 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>${CONSOLE_PATTERN}</Pattern>
        </encoder>
    </appender>
 
    <!-- 파일 출력 + 롤링 -->
    <appender name="ROLLING_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${ROLLING_PATTERN}</pattern>
        </encoder>
        <file>${FILE_NAME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_NAME_PATTERN}</fileNamePattern>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <totalSizeCap>${TOTAL_SIZE}</totalSizeCap>
        </rollingPolicy>
    </appender>
[ root 로거 설정 ]
<root level="INFO">
    // 콘솔 출력 파일 출력
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="ROLLING_LOG_FILE"/>
</root>
[ 특정 패키지 로그 설정 ]
 
<logger name="com.example.application.paging" level="DEBUG" additive="false" >
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
 
ex) JDBC 관련 로그 설정
<logger name="jdbc" level="OFF" additive="false">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="ROLLING_LOG_FILE"/>
</logger>

전체 코드

( Console + File 로그 출력 XML )

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    
    <!-- 로그 xml 파일 환경변수 사용 property -->
    <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %magenta([%thread]) %highlight([%-3level]) %logger{5} - %msg %n" />
    <property name="ROLLING_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}  %logger{5} - %msg %n" />
    <property name="FILE_NAME" value="C:/logs/application.log" />
    <property name="LOG_NAME_PATTERN" value="./logs/application-%d{yyyy-MM-dd HH:mm:ss}.%i.log" /> <!-- 1초 기준 로그 저장-->
    <property name="MAX_FILE_SIZE" value="10MB" />
    <property name="TOTAL_SIZE" value="30MB" />
    <property name="MAX_HISTORY" value="30" /> <!-- 보관 파일 개수 -->
    <!-- ----------------------------------------------------------- -->
    
    
    <!-- Console appender 설정 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>${CONSOLE_PATTERN}</Pattern>
        </encoder>
    </appender>
 
   <!-- ----------------------------------------------------------- -->
   
   <!-- Rolling File appender 설정 -->
    <appender name="ROLLING_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${ROLLING_PATTERN}</pattern>
        </encoder>
        <file>${FILE_NAME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_NAME_PATTERN}</fileNamePattern>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <totalSizeCap>${TOTAL_SIZE}</totalSizeCap>
        </rollingPolicy>
    </appender>
   
   <!-- ----------------------------------------------------------- -->
    
    
    <!-- SQL 쿼리 로그 기록 (level 및 로그 기록 여부 지정) -->
            <!-- JDBC 관련 로그 OFF + 로거 전파 x (상위로그 출력 x) -->
    <logger name="jdbc" level="OFF" additive="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_LOG_FILE"/>
    </logger>
            <!-- SQL 로그 + 로거 전파 x (상위로그 출력 x) -->
    <logger name="jdbc.sqlonly" level="DEBUG" additive="false" >
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_LOG_FILE"/>
    </logger>
            <!-- 쿼리 성능 측정 로그 OFF + 로거 전파 x (상위로그 출력 x) -->
    <logger name="jdbc.sqltiming" level="OFF" additive="false" >
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_LOG_FILE"/>
    </logger>
    <logger name="org.hibernate.SQL" level="DEBUG" additive="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_LOG_FILE"/>
    </logger>
 
    <!-- ----------------------------------------------------------- -->
    
    
    <!-- 패키지 하위 로그 기록 (level 지정// 각자 맞는 패키지명으로 변경 필요) -->
    <logger name="com.example.application.fileInputOutput" level="INFO" additive="true" >
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_LOG_FILE"/>
    </logger>
    <logger name="com.example.application.paging" level="DEBUG" additive="false" >
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_LOG_FILE"/>
    </logger>
 
    
    <!-- ----------------------------------------------------------- -->
    
    
    <!-- 전역 로그 설정  -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_LOG_FILE"/>
    </root>
    
    <!-- ----------------------------------------------------------- -->
    
</configuration>

로그파일 기록 현황

설정한 LOG_NAME_PATTERN에 따라 logs/ 디렉토리에 아래와 같이 시간·용량 기준으로 분리된 로그 파일들이 순차적으로 쌓이는 것을 확인할 수 있다.

logs/
├── application-2025-04-07-10.0.log
├── application-2025-04-07-11.0.log
├── application-2025-04-07-12.0.log
└── application.log        (현재 기록 중인 로그 파일)

각 파일은 maxFileSize(10MB) 도달 시 새 파일로 분리되고, totalSizeCap(30MB) 초과 시 가장 오래된 파일부터 자동 삭제된다.

참고 자료

https://logback.qos.ch/manual/configuration.html

 [Chapter 3: Configuration

In symbols one observes an advantage in discovery which is greatest when they express the exact nature of a thing briefly and, as it were, picture it; then indeed the labor of thought is wonderfully diminished. —GOTTFRIED WILHELM LEIBNIZ Chapter 3: Logba

logback.qos.ch](https://logback.qos.ch/manual/configuration.html)

https://logging.apache.org/log4j/2.x/manual/configuration.html

 [Configuration file :: Apache Log4j

Starting with Log4j 2, the configuration file syntax has been considered part of the public API and has remained stable across significant version upgrades. The syntax of the configuration file changed between Log4j 1 and Log4j 2. Files in the Log4j 1 s

logging.apache.org](https://logging.apache.org/log4j/2.x/manual/configuration.html)

관련 문서